package com.yuw.sort;

public class TestDriver01 {

	public static void main(String[] args) {
		test01();
	}

	private static void test01() {
		// 初始化一个数组
		//int[] arr0 = { 7, 2, 4, 1, 3, 5 };
		int[] arr0 = { 7,6,5,4,2,3 };
		System.out.println("冒泡排序之前：");
		printArr(arr0);
		// 调用冒泡排序算法
		//bubbleSort(arr0); // 引用传参
		//bubbleSort1(arr0); // 引用传参
		bubbleSort2(arr0); // 引用传参
		System.out.println("冒泡排序之后：");
		printArr(arr0);
	}

	/**
	 * 冒泡排序算法[从小到大]--优化
	 * 
	 * @param arr 被排序的数组
	 */
	public static void bubbleSort2(int[] arr) {
		// 效率统计，统计比较次数
		int count = 0;
		// 外层for循环：轮数
		for (int i = 0; i < arr.length; i++) {
			// 在每一轮进行比较时，设置一个是否发生交换的变量
			// 默认没有发生交换
			boolean isChanged = false;
			// 内层for循环：完成两两比较交换
			for (int j = 0; j < arr.length - 1 - i; j++) {
				// 比较次数+1
				count++;
				// 两两比较交换，排序规则：从小到大
				if (arr[j] < arr[j + 1]) {
					// 两个数进行交换
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
					// 修改是否发生交换的标识变量
					isChanged = true;
				}
			}
			// 判定此时数列是否有序
			if(isChanged == false) {
				// 此时没有发生交换，说明数列有序，此时可以中断循环
				break;
			}
		}
		System.out.println("本次冒泡排序算法发生的比较次数：" + count);
	}

	/**
	 * 冒泡排序算法[从小到大]--优化
	 * 
	 * @param arr 被排序的数组
	 */
	public static void bubbleSort1(int[] arr) {
		// 效率统计，统计比较次数
		int count = 0;
		// 外层for循环：轮数
		for (int i = 0; i < arr.length; i++) {
			// 内层for循环：完成两两比较交换
			for (int j = 0; j < arr.length - 1 - i; j++) {
				// 比较次数+1
				count++;
				// 两两比较交换，排序规则：从小到大
				if (arr[j] < arr[j + 1]) {
					// 两个数进行交换
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
		System.out.println("本次冒泡排序算法发生的比较次数：" + count);
	}

	/**
	 * 冒泡排序算法[从小到大]
	 * 
	 * @param arr 被排序的数组
	 */
	public static void bubbleSort(int[] arr) {
		// 效率统计，统计比较次数
		int count = 0;
		// 外层for循环：轮数
		for (int i = 0; i < arr.length; i++) {
			// 内层for循环：完成两两比较交换
			for (int j = 0; j < arr.length - 1; j++) {
				// 比较次数+1
				count++;
				// 两两比较交换，排序规则：从小到大
				if (arr[j] < arr[j + 1]) {
					// 两个数进行交换
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
		System.out.println("本次冒泡排序算法发生的比较次数：" + count);
	}

	/**
	 * 打印数组
	 * 
	 * @param arr
	 */
	public static void printArr(int[] arr) {
		for (int i : arr) {
			System.out.print("  " + i);
		}
		// 换行
		System.out.println();
	}
}
